home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / var / lib / python-support / python2.6 / GMenuSimpleEditor / menufilewriter.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  5.8 KB  |  184 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import os
  5. import errno
  6. import pwd
  7. import gobject
  8. import menutreemodel
  9. DTD_DECLARATION = '<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"\n "http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd">\n\n'
  10.  
  11. class MenuFileWriterError(Exception):
  12.     pass
  13.  
  14.  
  15. def get_home_dir():
  16.     
  17.     try:
  18.         pw = pwd.getpwuid(os.getuid())
  19.         if pw.pw_dir:
  20.             return pw.pw_dir
  21.     except KeyError:
  22.         pass
  23.  
  24.     if os.environ.has_key('HOME'):
  25.         return os.environ['HOME']
  26.     raise MenuFileWriterError(_('Cannot find home directory: not set in /etc/passwd and no value for $HOME in environment'))
  27.  
  28.  
  29. def get_user_menu_file_path(menu_file):
  30.     config_dir = None
  31.     if os.environ.has_key('XDG_CONFIG_HOME'):
  32.         config_dir = os.environ['XDG_CONFIG_HOME']
  33.     
  34.     if not config_dir:
  35.         config_dir = os.path.join(get_home_dir(), '.config')
  36.     
  37.     return os.path.join(config_dir, 'menus', menu_file)
  38.  
  39.  
  40. def write_file(filename, contents):
  41.     dir = os.path.dirname(filename)
  42.     
  43.     try:
  44.         os.makedirs(dir)
  45.     except os.error:
  46.         (err, str) = None
  47.         if err != errno.EEXIST:
  48.             raise 
  49.         err != errno.EEXIST
  50.  
  51.     temp = filename + '.new'
  52.     
  53.     try:
  54.         f = file(temp, 'w')
  55.     except:
  56.         temp = None
  57.         f = file(filename, 'w')
  58.  
  59.     
  60.     try:
  61.         f.write(contents)
  62.         f.close()
  63.     except:
  64.         if temp != None:
  65.             os.remove(temp)
  66.         
  67.         raise 
  68.  
  69.     if temp != None:
  70.         os.rename(temp, filename)
  71.     
  72.  
  73.  
  74. class MenuFileWriter:
  75.     
  76.     def __init__(self, menu_tree_model):
  77.         self.model = menu_tree_model
  78.         self.sync_idle_handlers = { }
  79.  
  80.     
  81.     def __del__(self):
  82.         for id, iter in self.sync_idle_handlers:
  83.             gobject.source_remove(id)
  84.         
  85.  
  86.     
  87.     def __append_menu(self, contents, indent, iter, system_menu_file = None):
  88.         has_changes = False
  89.         orig_contents = contents
  90.         contents += indent + '<Menu>\n'
  91.         contents += indent + '  <Name>%s</Name>\n' % self.model[iter][self.model.COLUMN_ID]
  92.         if system_menu_file:
  93.             contents += indent + '  <MergeFile type="parent">%s</MergeFile>\n' % system_menu_file
  94.         
  95.         includes = []
  96.         excludes = []
  97.         child_iter = self.model.iter_children(iter)
  98.         while child_iter:
  99.             if self.model[child_iter][self.model.COLUMN_IS_ENTRY]:
  100.                 desktop_file_id = self.model[child_iter][self.model.COLUMN_ID]
  101.                 system_visible = self.model[child_iter][self.model.COLUMN_SYSTEM_VISIBLE]
  102.                 user_visible = self.model[child_iter][self.model.COLUMN_USER_VISIBLE]
  103.                 if not system_visible and user_visible:
  104.                     includes.append(desktop_file_id)
  105.                 elif system_visible and not user_visible:
  106.                     excludes.append(desktop_file_id)
  107.                 
  108.             
  109.             child_iter = self.model.iter_next(child_iter)
  110.         if len(includes) > 0:
  111.             contents += indent + '  <Include>\n'
  112.             for desktop_file_id in includes:
  113.                 contents += indent + '    <Filename>%s</Filename>\n' % desktop_file_id
  114.             
  115.             contents += indent + '  </Include>\n'
  116.             has_changes = True
  117.         
  118.         if len(excludes) > 0:
  119.             contents += indent + '  <Exclude>\n'
  120.             for desktop_file_id in excludes:
  121.                 contents += indent + '    <Filename>%s</Filename>\n' % desktop_file_id
  122.             
  123.             contents += indent + '  </Exclude>\n'
  124.             has_changes = True
  125.         
  126.         child_iter = self.model.iter_children(iter)
  127.         while child_iter:
  128.             if not self.model[child_iter][self.model.COLUMN_IS_ENTRY]:
  129.                 (contents, subdir_has_changes) = self._MenuFileWriter__append_menu(contents, indent + '  ', child_iter)
  130.                 if not has_changes:
  131.                     has_changes = subdir_has_changes
  132.                 
  133.             
  134.             child_iter = self.model.iter_next(child_iter)
  135.         if has_changes:
  136.             return (contents + indent + '</Menu>\n', True)
  137.         return (orig_contents, False)
  138.  
  139.     
  140.     def sync(self, iter):
  141.         menu_file = self.model[iter][self.model.COLUMN_MENU_FILE]
  142.         system_menu_file = menutreemodel.lookup_system_menu_file(menu_file)
  143.         (contents, has_changes) = self._MenuFileWriter__append_menu(DTD_DECLARATION, '', iter, system_menu_file)
  144.         if not has_changes:
  145.             
  146.             try:
  147.                 os.remove(get_user_menu_file_path(menu_file))
  148.             except:
  149.                 pass
  150.  
  151.             return None
  152.         write_file(get_user_menu_file_path(menu_file), contents)
  153.  
  154.     
  155.     def __sync_idle_handler_func(self, iter):
  156.         self.sync(iter)
  157.         del self.sync_idle_handlers[iter]
  158.         return False
  159.  
  160.     
  161.     def queue_sync(self, iter):
  162.         
  163.         def find_menu_file_parent(model, iter):
  164.             if model[iter][model.COLUMN_MENU_FILE]:
  165.                 return iter
  166.             parent_iter = model.iter_parent(iter)
  167.             if not parent_iter:
  168.                 return None
  169.             return find_menu_file_parent(model, parent_iter)
  170.  
  171.         menu_file_iter = find_menu_file_parent(self.model, iter)
  172.         if not menu_file_iter:
  173.             return None
  174.         menu_file_path = self.model.get_string_from_iter(menu_file_iter)
  175.         for iter in self.sync_idle_handlers:
  176.             path = self.model.get_string_from_iter(iter)
  177.             if path == menu_file_path:
  178.                 return None
  179.         
  180.         id = gobject.idle_add(self._MenuFileWriter__sync_idle_handler_func, menu_file_iter)
  181.         self.sync_idle_handlers[menu_file_iter] = id
  182.  
  183.  
  184.